package de.haw.ai3.bs.aufgabe3.a2.table;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import de.haw.ai3.bs.aufgabe3.a2.Agent;
import de.haw.ai3.bs.aufgabe3.a2.Smoker;
import de.haw.ai3.bs.aufgabe3.a2.Zutat;


public class ReentrantTable extends Table {

	private final Lock lock = new ReentrantLock();

	private final Condition agentQueque = lock.newCondition();
	private final Condition smokerQueque = lock.newCondition();

	@Override
	public void platzieren(Zutat[] zutaten, Agent agent)
			throws InterruptedException {
		lock.lock();
		try {
			while (isFull()) {
				agentQueque.await();
			}

			this.zutat1 = zutaten[0];
			this.zutat2 = zutaten[1];
			System.err.println(String.format(
					"\t\t\t%s der Agent legt [%s / %s] auf den Tisch", agent,
					zutat1, zutat2));

			smokerQueque.signalAll();
		} finally {
			lock.unlock();
		}
	}

	@Override
	public Zutat[] nehmen(Smoker smoker) throws InterruptedException {
		lock.lock();
		try {
			while (isEmpty() || doesntMatch(smoker)) { // es liegt nichts auf
														// dem Tisch oder die
														// Zutaten passen nicht
				smokerQueque.await();
			}

			Zutat[] zutaten = new Zutat[] { Zutat.valueOf(zutat1.name()),
					Zutat.valueOf(zutat2.name()) };
			this.zutat1 = null;
			this.zutat2 = null;
			System.err.println(String.format(
					"%s nimmt sich die Zutaten und hat jetzt [%s] [%s] [%s]",
					smoker, zutaten[0], zutaten[1], smoker.getImBesitz()));

			agentQueque.signalAll();
			return zutaten;
		} finally {
			lock.unlock();
		}
	}

}
